const express = require("express");
const router = express.Router();
const { sign } = require("../utils/jwt");
const mailCodeModel = require("../db/model/mailCodeModel");
const userModel = require("../db/model/userModel");
const { sendMailCode } = require("../utils/mail");

router.get("/reg", async (req, res) => {
  // 获取get请求的数据
  const { user, pwd, mailCode } = req.query;

  // 先判断验证码是否合法
  if (!mailCode || !user || !pwd) {
    return res.send({ code: -3, msg: "参数缺失" });
  }

  // 判断验证码是否ok
  let isOk = await mailCodeModel.findOne({ mail: user, mailCode: mailCode });

  if (!isOk) {
    return res.send({ code: -4, msg: "验证码错误" });
  }
  // 先判断用户是否存在
  //   const isHave = await userModel.findOne({ user });
  //   if (isHave) return res.send({ code: -1, msg: "用户名重复" });

  let result = null;
  // 通过try catch 捕获错误
  try {
    // 通过数据模型的方法 向users表插入数据
    result = await userModel.insertMany({ user, pwd });
  } catch (error) {
    res.send({ code: -2, msg: "内部错误", error });
  }

  if (result) {
    return res.send({ code: 0, msg: "注册成功" });
  }
  res.send({ code: -1, msg: "注册失败" });
});

router.post("/login", async (req, res) => {
  // 获取get请求的数据
  const { user, pwd } = req.query;
  // 查询用户数据在数据库里是否存在
  const result = await userModel.findOne({ user, pwd });
  console.log(result);

  if (!result) return res.send({ code: -1, msg: "用户名密码错误" });
  // 产生token
  const token = await sign({ user: result.user, _id: result._id });
  if (!token) return res.send({ code: -1, msg: "内部错误" });
  // 将产生的token更新到用户信息表
  const updateRes = await userModel.updateOne(
    { _id: result._id },
    { $set: { token } }
  );
  if (!updateRes) return res.send({ code: -1, msg: "内部错误" });
  return res.send({ code: 0, msg: "登录OK", token });
});

router.post("/getMailCode", async (req, res) => {
  const { mail } = req.body;
  if (!mail) return res.send({ code: -1, msg: "参数错误" });
  const mailCode = parseInt(Math.random() * 10000);
  // 判断邮箱是否存在 存在更新code 不窜在新建
  const isHave = await mailCodeModel.findOne({ mail });

  let tud = null;
  if (isHave) {
    // 更新
    // updateOne 第一个参数是条件 表示要修改那条数据
    // 第二个参数是修改的目标
    tud = await mailCodeModel.updateOne(
      { mail: mail },
      { $set: { mailCode: mailCode } }
    );
  } else {
    // 将验证码和邮箱信息存起来
    tud = await mailCodeModel.insertMany({ mail, mailCode });
  }

  if (!tud) res.send({ code: -1, msg: "内部错误", data: tud });
  const result = await sendMailCode(mailCode, mail);
  res.send({ code: 0, msg: "发送成功", res: result, mailCode });
});

module.exports = router;
